home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
language
/
examples.zoo
/
misc
/
intmisc.lsp
< prev
next >
Wrap
Lisp/Scheme
|
1991-10-22
|
1KB
|
48 lines
;; Verschiedene Funktionen für Integers
;; Bruno Haible 25.4.1989, 5.9.1990
(provide 'intmisc)
; exakter Quotient von Integers, schneller als / :
#-CLISP
(defun exquo (a b)
(multiple-value-bind (q r) (floor a b)
(unless (zerop r) (error "Quotient ~S/~S nicht exakt." a b))
q
) )
; Fakultät:
#-CLISP
(defun ! (n)
(assert (and (integerp n) (>= n 0))
(n)
"Argument muß eine natürliche Zahl sein, nicht ~S" n
)
(do* ((p 1 (* p i))
(i n (- i 1)))
((zerop i) p)
) )
; Installiert eine Funktionsdefinition einer auf N0 definierten Funktion
; (mit NIL nicht im Wertebereich) mit "Gedächtnis" unter name:
(defmacro defun-N0 (name (var) &body body &environment env)
(multiple-value-bind (body-rest declarations)
(sys::parse-body body nil env)
(if declarations
(setq declarations (list (cons 'DECLARE (nreverse declarations))))
)
(let ((remember (gensym)))
`(let ((,remember (make-array 0 :adjustable t :initial-element nil)))
(defun ,name (,var)
,@declarations
; (assert (typep ,var '(integer 0 *))) ; Typtest
(assert (and (integerp ,var) (>= ,var 0))) ; explizit
(unless (< ,var (length ,remember))
(setq ,remember (adjust-array ,remember (+ ,var 1 50)))
)
(or (aref ,remember ,var)
(setf (aref ,remember ,var) (progn ,@body-rest))
) ) )
) ) )